#!/usr/bin/env python
#
# Copyright 2004 Free Software Foundation, Inc.
# 
# This file is part of GNU Radio
# 
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
# 

import sys
import re

def write_header (f):
    f.write ('''/* -*- c++ -*- */
/*
 * Copyright 2004 Free Software Foundation, Inc.
 * 
 * This file is part of GNU Radio
 * 
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 * 
 * GNU Radio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

#ifndef INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H
#define INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H

/*
 * This include files works around a bug in SWIG 1.3.21 and 22
 * where it fails to emit these declarations when doing
 * %import "gnuradio.i"
 */

''')
    
def write_trailer (f):
    f.write ('''
#endif /* INCLUDED_GNURADIO_SWIG_BUG_WORKAROUND_H */
''')

def doit (input, output):
    re_RULES_BEGIN = re.compile ('RULES \(BEGIN\)')
    re_RULES_END = re.compile ('RULES \(END\)')
    re_RETURN = re.compile ('^\s*return')
    re_NOT_ID = re.compile ('[^a-zA-Z0-9_]')
    words = {}
    
    write_header (output)
    for line in input:
        if re_RULES_BEGIN.search (line):
            break

    for line in input:
        if re_RULES_END.search (line):
            break
        if not re_RETURN.match (line):
            continue
        line = re_NOT_ID.sub (' ', line)
        line = re.sub (' +', ' ', line)
        for w in line.split (' '):
            words[w] = 1

    for w in ('', 'return', 'void', 'x'):
        del words[w]
    
    wl = words.keys()
    wl.sort ()
    for w in wl:
        output.write ('class ' + w + ';\n')

    write_trailer (output)
    

def main ():
    if len (sys.argv) != 3:
        sys.stderr.write ("usage: %s gnuradio_swig_python.cc gnuradio_swig_bug_workaround.h\n"
                          % (sys.argv[0],))
        sys.exit (1)
    input_filename = sys.argv[1]
    output_filename = sys.argv[2]
    input = open (input_filename, "r")
    output = open (output_filename, "w")
    doit (input, output)

if __name__ == '__main__':
    main ()

